#include "app_common.h"
#include "pthread.h"
#include "mqueue.h"

mqd_t mq;
void *fun(void *args)
{
    char buf[1024];
    // 返回值: 实际收到的消息的长度
    ssize_t len = mq_receive(mq, buf, sizeof(buf), NULL);
    if (len == -1)
    {
        perror("接收错误");
        return NULL;
    }
    log_info("接收到消息: %.*s", len, buf);
}

int main(int argc, char const *argv[])
{
    pthread_t id;
    pthread_create(&id, NULL, fun, NULL);

    // 打开或创建一个消息队列  /dev/my_mq
    struct mq_attr attr;
    attr.mq_flags = 0;      // 阻塞式读取消息
    attr.mq_maxmsg = 10;    // 队列存储的最大消息数
    attr.mq_msgsize = 1024; // 队列中每条消息的最大字节数
    mq = mq_open("/my_mq", O_RDWR | O_CREAT, 0666, &attr);
    if (mq == (mqd_t)-1)
    {
        perror("队列创建失败"); // 队列创建失败: ....
    }
    log_info("队列创建成功");

    // 发送消息
    char *msg = "hello world";
    if (mq_send(mq, msg, strlen(msg), 0) == -1)
    {
        log_error("发送消息失败");
    }
    log_info("发送消息成功");
    mq_send(mq, msg, strlen(msg), 0);
    mq_send(mq, msg, strlen(msg), 0);
    pthread_join(id, NULL);

    // 关闭队列: 参数消息队列描述符
    mq_close(mq);

    // 删除消息队列: 消息队列的名字
    mq_unlink("/my_mq");

    return 0;
}
/*
线程退出:
    1. 现在函数执行完毕,自动退出
    2. 线程内部调用 pthread_exit()
    3. 线程外部调用 pthread_cancel()


*/
